/**
 * 磁盘文件file1和file2中各存放一行字母字符，要求编写程序把这两个文件中的信息合并（按字母升序排列）输出到file3中。
 */

#include <stdio.h>
#include <stdlib.h>

//用来做比较的函数。
int cmp(const void *a, const void *b)
{
    return *(char *)a - *(char *)b;
}

long GetFileSize(FILE *fp)
{
    // 获取当前文件指针相对于文件头的偏移量
    long curLocation = ftell(fp);
    // 将文件指针移动到文件末尾
    fseek(fp, 0, SEEK_END);
    // 获取文件指针的偏移量(因为文件指针在文件尾，所以文件指针偏移量就是文件的大小)
    long size = ftell(fp);
    // 恢复文件指针的位置
    fseek(fp, curLocation, SEEK_SET);
    return size;
}

int main()
{
    FILE *fp1 = fopen("./file1.txt", "r");
    FILE *fp2 = fopen("./file2.txt", "r");
    FILE *fp3 = fopen("./file3.txt", "w");
    long f1siz = GetFileSize(fp1);
    long f2siz = GetFileSize(fp2);
    char *f3cont = (char *)calloc(f1siz + f2siz + 2, sizeof(char));
    int ind = 0;
    // 这种做法有个小问题：会把回车‘\n’也算进去
    // while (fscanf(fp1, "%c", f3cont + ind) != EOF)
    // {
    //     ind++;
    // }
    // while (fscanf(fp2, "%c", f3cont + ind) != EOF)
    // {
    //     ind++;
    // }
    while (fscanf(fp1, "%c", f3cont + ind) != EOF)
    {
        if (f3cont[ind] != '\n')
            ind++;
    }
    while (fscanf(fp2, "%c", f3cont + ind) != EOF)
    {
        if (f3cont[ind] != '\n')
            ind++;
    }
    // 这里使用的qsort库函数，刘老师不建议大家使用库函数，所以大家还请自己手写排序算法吧（调库一时爽，一直调库一直爽）哈哈
    qsort(f3cont, ind, sizeof(char), cmp);
    printf("%s", f3cont);
    fputs(f3cont, fp3);
    free(f3cont);
    fclose(fp1);
    fclose(fp2);
    fclose(fp3);
    return 0;
}